// 引入koa-router
const Router = require('koa-router')
// 引入上传头像utils
const { uploadimg } = require('../../utils/uploadUtils')
// 引入处理函数
const { uploadImg, delUploadImg } = require('../../controller/uploadImg.controller')

// 引入koa-body来处理文件上传
const { koaBody } = require('koa-body')
// 引入fs模块来处理文件写入
const fs = require('fs')
// 引入path模块来处理文件路径
const path = require('path')


// 创建实例
// prefix在路由地址前缀加上默认地址
const router = new Router({ prefix: '/api/upload' })
// 通用单个图片上传
router.post('/uploadimg', uploadimg.single('file'), uploadImg)
// 通用单个图片删除
router.post('/deluploadimg', delUploadImg)


// 大文件切片上传
router.post('/uploadChunk', koaBody({
    multipart: true,
    formidable: {
        uploadDir: path.join(__dirname, '../../uploads/temp'), // 临时存储切片文件的目录
        keepExtensions: true,

    }
}), async (ctx) => {

    const { files, body } = ctx.request
    const { chunkNumber, totalChunks, identifier, filename } = body
    const file = files.file
    let _ctx= ctx
    // 创建临时存储目录
    const tempDir = path.join(__dirname, '../../uploads/temp', identifier)

    if (!fs.existsSync(tempDir)) {
        fs.mkdirSync(tempDir, { recursive: true })
    }

    // 移动切片文件到临时目录
    const chunkPath = path.join(tempDir, `chunk-${chunkNumber}`+'.mp4')

    fs.renameSync(file.filepath, chunkPath)

    // // 检查是否所有切片都已上传
    const chunks = fs.readdirSync(tempDir).filter(chunk => chunk.startsWith('chunk-'))
    
    if (chunks.length === parseInt(totalChunks)) {
        fs.writeFileSync(path.join(__dirname, '../../uploads/vedio', filename), '');
        // 读取文件夹下面的所有chunks
        const chunksArr = fs.readdirSync(tempDir).sort((a, b) => {
            const numA = parseInt(a.split('-')[1].split('.')[0], 10); // 提取 chunk-0.mp4 中的 0
            const numB = parseInt(b.split('-')[1].split('.')[0], 10); // 提取 chunk-1.mp4 中的 1
            return numA - numB; // 按数字升序排序
        });
        for (let index = 0; index < chunksArr.length; index++) {
            if( index+1  == chunksArr.length){
                // 追加写入文件
            // 生成的文件名
            let filePath = path.join(path.join(__dirname, '../../uploads/vedio/', filename))
            // 追加写入文件
            fs.appendFileSync(filePath, fs.readFileSync(path.join(tempDir, chunksArr[index])));
            // 删除本次用的chunk
            fs.unlinkSync(path.join(tempDir, chunksArr[index]));
                ctx.body = { code: 200, message: `切片文件合并成功` };
            }else{
                // 追加写入文件
                // 生成的文件名
                let filePath = path.join(path.join(__dirname, '../../uploads/vedio/', filename))
                // 追加写入文件
                fs.appendFileSync(filePath, fs.readFileSync(path.join(tempDir, chunksArr[index])));
                // 删除本次用的chunk
                fs.unlinkSync(path.join(tempDir, chunksArr[index]));
            }
        }
    }else{
        ctx.body = { code: 200, message: `Chunk ${chunkNumber} uploaded` };
    }
})
module.exports = router